查看原文
其他

放后台的Linux任务没有了,试试这个命令

Cloud研习社 Cloud研习社 2023-06-06


前两天有个新来的“小同事”问我,他有个任务下班前跑起来了,预计跑一夜就能完成了,第二天正好看结果,但是,等他第二天上班以后发现程序在他下班以后并没有运行,这是为什么呢?经过询问,他使用了&操作符。


&误区


提到把任务放到后台运行,有些小伙伴肯定第一印象是“&”操作符。

没错,“&”操作符确实可以直接将任务丢到后台执行,前台无需等待。你可以继续在当前终端继续执行其他命令。但这仅仅是当前终端模式的后台,即这个后台任务依然和当前的终端有着千丝万缕的关系,我们来看。

# 第一个终端:把任务放到当前终端的后台
[root@m01 ~]# sh test_nohup.sh &
[1] 1548
[root@m01 ~]# begin test nohup
[root@m01 ~]# echo $BASHPID # 查看当前的终端进程号
1298


# 第二个终端:再开一个终端
[root@m01 ~]# nohup sh test_nohup.sh &
[1] 1557
[root@m01 ~]# nohup: ignoring input and appending output to ‘nohup.out’
[root@m01 ~]# echo $BASHPID # 查看当前的终端进程号
1456


# 此时我们再开第三个终端,查看当前进程情况:
[root@m01 ~]# ps aux | grep test_nohup.sh
root 1548  0.0  0.1 113288  1196 pts/1    S 22:20   0:00 sh test_nohup.sh
root 1557  0.0  0.1 113288  1196 pts/2    S 22:20   0:00 sh test_nohup.sh
root 1561  0.0  0.1 112812   996 pts/3    R+ 22:20   0:00 grep --color=auto test_nohup.sh


在第三个终端看一下当前的进程树结构:


接下来我们直接关闭第二个终端,然后在第三个终端查看:

[root@m01 ~]# ps aux | grep test_nohup.sh
root 1548  0.0  0.1 113288  1196 pts/1    S 22:20   0:00 sh test_nohup.sh
root 1557  0.0  0.1 113288  1196 pts/2    S 22:20   0:00 sh test_nohup.sh
root 1561  0.0  0.1 112812   996 pts/3    R+ 22:20   0:00 grep --color=auto test_nohup.sh


我们会发现,虽然关闭了终端,但是,程序还在跑。

接下来我们关闭第一个终端,然后在第三个终端再次查看:

[root@m01 ~]# ps aux | grep test_nohup.sh
root 1557  0.0  0.1 113288  1196 pts/2    S 22:20   0:00 sh test_nohup.sh
root 1561  0.0  0.1 112812   996 pts/3    R+ 22:20   0:00 grep --color=auto test_nohup.sh


我们会发现bashid为1296的第一个终端关闭以后,任务对应的1548没有了,说明程序不再跑了。

小结:&只是把任务放到当前终端的后台,依据当前终端生存,终端关闭了,那么任务也就关闭了。

如果想实现终端关闭后任务依旧可以跑,那就需要nohup。



nohup


nohup 英文全称 no hang up(不挂起),用于在系统后台不中断地运行命令,退出终端不会影响程序的运行。这个命令会使程序忽略 HUP 信号,保证程序能够正常进行。(HUP 信号是在终端被中止的时候向它所关联的进程所发出的信号,进程收到这个信号后就会中止运行。)所以如果不希望进程被这个信号干掉的话,就可以忽略这个信号。而 nohup 命令做的就是这个事情。

上面实验我们也看到了,nohup 命令,在默认情况下(非重定向时),会输出一个名叫 nohup.out 的文件到当前目录下。

语法格式:

[root@studyclub ~]# nohup [命令与参数] <==在当前终端前台中工作
[root@studyclub ~]# nohup [命令与参数] & <==在当前终端后台中工作


我们来看几个示例:

使用nohup命令后台启动一个程序


[root@studyclub ~]# nohup ./job.sh &
[1] 10174
[root@studyclub ~]# nohup: ignoring input and appending output to ‘nohup.out’ # 提示输出信息的保存位置
[root@studyclub ~]# jobs -l
[1]+ 18250 Running nohup ./job.sh & # jobs已经有了

# 接下来我们退出当前终端
[root@studyclub ~]# logout

# 重新登录linux,并查看jobs
[root@studyclub ~]# ps aux | grep job
root 18250 49.5  0.1 113180  1196 ? R 16:37   0:44 /bin/bash ./job.sh # 之前提交的任务还在


使用nohup同时运行多个程序

上面的示例都是启动一个程序,如果需要同时跑多个程序,我们可以这样做:


[root@studyclub ~]# nohup sh 'cp files testfile && ping 8.8.8.8 && sleep5'


对于后台的程序,如果我们不想要了,如何终止:
找到对应的PID

ps aux | grep test_nohup.sh


然后:

kill -9 PID


例如前面的例子,我们用下面的命令把sh test_nohup.sh任务结束:

kill -9 1557



推荐阅读

Linux 网络状态工具 ss 命令详解

万字好文,最全 VxLAN 知识详解

Linux 的磁盘 I/O 性能监测


除每周二、四、六定期更新的《Linux云计算一站式教程》以外,其余时间雷哥会推送一些工作中遇到的小知识、实战经验总结的文章。后续都会收录在“实战经验”合集中。


拉到最下方,给我“发消息”



点个在看你最好看


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存